<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
</html>

<script>
  /* 
    
    5. promise 异常传透?
      (1) 当使用promise的then链式调用时,可以在最后指定失败的回调, 
      (2) 前面任何操作出了异常, 都会传到最后失败的回调中处理

    */

  function fn1() {
    new Promise((resolve, reject) => {
      reject(1)
    })
      .then(
        res => {
          console.log('res1()', res)
        },
        err => {
          console.log('err1()', err) // 1 Promise返回失败态 执行err回调函数 返回了undefined
        }
      )
      .then(
        res => {
          console.log('res2()', res) // 上一次then回调函数返回undefined 执行res回调函数 因为是成功态
        },
        err => {
          console.log('err2()', err)
        }
      )
      .catch(err => {
        // 此时catch就不会执行了 因为没有失败态传下来 所以catch的捕获也是一层层捕获的 并非第一次为失败态 就直接被catch捕获到了
        console.log('err', err + 'xxxxx')
      })
  }
  // fn1()

  function fn2() {
    new Promise((resolve, reject) => {
      reject(1)
    })
      .then(
        res => {
          console.log('res1()', res)
        },
        // 当我们没在then函数中传入第二个回调函数的时候 会catch捕获 其实相当于写了一个默认值
        // 默认值函数：当我们不写第二个函数时 相当于写了以下代码 （指定默认函数为内部处理的）
        err => {
          throw err
        }
      )
      .then(
        res => {
          console.log('res2()', res)
        },
        // 如果当我们在这写了捕获异常的回调 就能捕获到上一次then返回执行返回的异常 这个时候 如果没有什么错误 下一个错误捕获函数(.then中的第二个回调函数)或catch方法就无错可捕获了
        // 默认值：
        err => {
          throw err
        }
      )
      .catch(err => {
        console.log('catch => err', err)
        // 我们想要在catch中中断链的调用 如何操作？
        return new Promise(() => {}) // 中断
        // 新的promise的结果决定了.catch 返回的promise结果 但是这个promise没有结果 执行下一个then的时候 由于上一个链式调用函数没结果 无法决定下一个链式方法执行哪个回调函数 所以下一个方法传入的函数都不会执行 那么链就中断了
      }).then(res => {
        // 不再执行
        console.log('catch ==> then - res', res)
      })
  }
  fn2()

  // ----------------------------------------------------------------

  /* 
  
  6. 中断 promise 链?
    (1) 当使用promise的then链式调用时,在中间中断,不再调用后面的回调函数 
    (2) 办法:在回调函数中返回一个pendding状态的promise对象
  
  */
</script>
